home *** CD-ROM | disk | FTP | other *** search
/ Internet Info 1994 March / Internet Info CD-ROM (Walnut Creek) (March 1994).iso / networking / ip / ka9q / src.arc / ECVEC.ASM < prev    next >
Assembly Source File  |  1989-03-20  |  4KB  |  184 lines

  1.     .MODEL    MEMMOD,C
  2.     LOCALS
  3.     %MACS
  4.     .LALL
  5.  
  6.     extrn    Stktop,Spsave,Sssave,ecint:proc,doret:proc
  7.  
  8.     .CODE
  9. dbase    dw    @Data        ; save loc for ds (must be in code segment)
  10.  
  11. ; ec0vec - Ethernet interrupt handler
  12.     public    ec0vec
  13.     label    ec0vec far
  14.     push    ds        ; save on user stack
  15.     mov    ds,cs:dbase    ; establish interrupt data segment
  16.  
  17.     mov    Sssave,ss    ; stash user stack context
  18.     mov    Spsave,sp
  19.  
  20.     mov    ss,cs:dbase
  21.     lea    sp,Stktop
  22.  
  23.     push    ax        ; save user regs on interrupt stack
  24.     push    bx
  25.     push    cx
  26.     push    dx
  27.     push    bp
  28.     push    si
  29.     push    di
  30.     push    es
  31.  
  32.     mov    ax,0        ; arg for service routine
  33.     push    ax
  34.     call    ecint
  35.     pop    ax
  36.     jmp    doret
  37.  
  38. ; ec1vec - Ethernet interrupt handler
  39.     public    ec1vec
  40.     label    ec1vec far
  41.     push    ds        ; save on user stack
  42.     mov    ds,cs:dbase    ; establish interrupt data segment
  43.  
  44.     mov    Sssave,ss    ; stash user stack context
  45.     mov    Spsave,sp
  46.  
  47.     mov    ss,cs:dbase
  48.     lea    sp,Stktop
  49.  
  50.     push    ax        ; save user regs on interrupt stack
  51.     push    bx
  52.     push    cx
  53.     push    dx
  54.     push    bp
  55.     push    si
  56.     push    di
  57.     push    es
  58.  
  59.     mov    ax,1        ; arg for service routine
  60.     push    ax
  61.     call    ecint
  62.     pop    ax
  63.     jmp    doret
  64.  
  65. ; ec2vec - Ethernet interrupt handler
  66.     public    ec2vec
  67.     label    ec2vec far
  68.     push    ds        ; save on user stack
  69.     mov    ds,cs:dbase    ; establish interrupt data segment
  70.  
  71.     mov    Sssave,ss    ; stash user stack context
  72.     mov    Spsave,sp
  73.  
  74.     mov    ss,cs:dbase
  75.     lea    sp,Stktop
  76.  
  77.     push    ax        ; save user regs on interrupt stack
  78.     push    bx
  79.     push    cx
  80.     push    dx
  81.     push    bp
  82.     push    si
  83.     push    di
  84.     push    es
  85.  
  86.     mov    ax,2        ; arg for service routine
  87.     push    ax
  88.     call    ecint
  89.     pop    ax
  90.     jmp    doret
  91.  
  92. ; fast buffer I/O routines -- used by 3-COM Ethernet controller
  93.  
  94. ; outbuf - put a buffer to an output port
  95.     public    outbuf
  96. outbuf    proc
  97.     arg    port:word,buf:ptr,cnt:word
  98.     if    @Datasize NE 0
  99.         uses    ds,si
  100.         lds    si,buf    ; ds:si = buf
  101.     else
  102.         uses    si
  103.         mov    si,buf    ; ds:si = buf (ds already set)
  104.     endif
  105.  
  106.     mov    dx,port
  107.     mov    cx,cnt
  108.     cld
  109.  
  110. ; If buffer doesn't begin on a word boundary, send the first byte
  111.     test    si,1    ; (buf & 1) ?
  112.     jz    @@even ; no
  113.     lodsb        ; al = *si++;
  114.     out    dx,al    ; out(dx,al);
  115.     dec    cx    ; cx--;
  116.     mov    cnt,cx    ; save for later test
  117. @@even:
  118.     shr    cx,1    ; cx = cnt >> 1; (convert to word count)
  119. ; Do the bulk of the buffer, a word at a time
  120.     jcxz    @@nobuf    ; if(cx != 0){
  121. @@deloop:
  122.     lodsw        ; do { ax = *si++; (si is word pointer)
  123.     out    dx,al    ; out(dx,lowbyte(ax));
  124.     mov    al,ah
  125.     out    dx,al    ; out(dx,hibyte(ax));
  126.     loop    @@deloop    ; } while(--cx != 0); }
  127. ; now check for odd trailing byte
  128. @@nobuf:
  129.     mov    cx,cnt
  130.     test    cx,1
  131.     jz    @@cnteven
  132.     lodsb        ; al = *si++;
  133.     out    dx,al
  134. @@cnteven:
  135.     ret
  136. outbuf    endp
  137.  
  138. ; inbuf - get a buffer from an input port
  139.     public    inbuf
  140. inbuf    proc
  141.     arg port:word,buf:ptr,cnt:word
  142.     uses    di
  143.     if    @Datasize NE 0
  144.         les    di,buf    ; es:di = buf
  145.     else
  146.         mov    di,buf    ; es:di = buf
  147.         mov    ax,ds
  148.         mov    es,ax
  149.     endif
  150.     mov    dx,port
  151.     mov    cx,cnt
  152.     cld
  153.  
  154. ; If buffer doesn't begin on a word boundary, get the first byte
  155.     test    di,1    ; if(buf & 1){
  156.     jz    @@bufeven ;
  157.     in    al,dx    ; al = in(dx);
  158.     stosb        ; *di++ = al
  159.     dec    cx    ; cx--;
  160.     mov    cnt,cx    ; cnt = cx; } save for later test
  161. @@bufeven:
  162.     shr    cx,1    ; cx = cnt >> 1; (convert to word count)
  163. ; Do the bulk of the buffer, a word at a time
  164.     jcxz    @@nobuf    ; if(cx != 0){
  165. @@deloop:
  166.     in    al,dx    ; do { al = in(dx);
  167.     mov    ah,al
  168.     in    al,dx    ; ah = in(dx);
  169.     xchg    al,ah
  170.     stosw        ; *si++ = ax; (di is word pointer)
  171.     loop    @@deloop    ; } while(--cx != 0);
  172. ; now check for odd trailing byte
  173. @@nobuf:
  174.     mov    cx,cnt
  175.     test    cx,1
  176.     jz    @@cnteven
  177.     in    al,dx
  178.     stosb        ; *di++ = al
  179. @@cnteven:
  180.     ret
  181. inbuf    endp
  182.  
  183.     end
  184.